package ren.renshuaipeng.auth.web.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import ren.renshuaipeng.auth.common.AppContants;
import ren.renshuaipeng.auth.domain.auth.AuthPermission;
import ren.renshuaipeng.auth.domain.auth.AuthUser;
import ren.renshuaipeng.auth.service.auth.AuthPermissionService;
import ren.renshuaipeng.auth.service.auth.AuthUserService;
import ren.renshuaipeng.auth.web.BaseController;
import ren.renshuaipeng.util.ajax.AjaxDto;
import ren.renshuaipeng.util.anno.Token;
import ren.renshuaipeng.util.security.Digests;
import ren.renshuaipeng.util.security.Encodes;

/**
 * ClassName: LoginController<br/>
 * Function: 登录. <br/>
 * Date:     2015/12/17 13:03<br/>
 *
 * @author 任帅鹏（作者）
 * @version V1.00 （版本号）
 * @see
 * @since JDK 1.8
 */
@Controller
public class LoginController extends BaseController {

    //private static final Logger logger= LoggerFactory.getLogger(LoginController.class);
    @Autowired
    private AuthUserService authUserService;
    @Autowired
    private AuthPermissionService authPermissionService;

    @RequestMapping("/login")
    @Token(save=true)
    //@OperatorLog(getInfo="登陆页面")
    public String index(){
        return "login";
    }

    /**
     * @Name: login
     * @Description: 登录Form版
     * @Author 任帅鹏（作者）
     * @Version V1.00 （版本号）
     * @Create Date: 2015年12月18日 下午3:41:34（创建日期）
     * @Parameters: @param authUser
     * @Parameters: @param request
     * @Parameters: @return
     * @Return String
     * @Throws
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @Token(remove=true)
    //@OperatorLog(getInfo="登陆",getType=OperatorLogType.SEARCH)
    public String login(AuthUser authUser,
    		HttpServletRequest request,
    		RedirectAttributes redirectAttributes) throws Exception {
//    	Thread.sleep(5000);
        AuthUser authUser_=authUserService.findByLoginName(authUser.getLoginName());
        if(authUser_==null){
        	redirectAttributes.addFlashAttribute("error", "用户不存在");
        	redirectAttributes.addFlashAttribute("loginName", authUser.getLoginName());
            return "redirect:/login";
        }
        if(!validLoginPwd(authUser.getLoginPwd(),authUser_)){
        	redirectAttributes.addFlashAttribute("error", "用户或密码不正确");
        	redirectAttributes.addFlashAttribute("loginName", authUser.getLoginName());
            return "redirect:/login";
        }       
        request.getSession().setAttribute(AppContants.LOGIN_SESSION, authUser_);
        
        //1.读取权限
    	List<AuthPermission> authList=authPermissionService.findAll();
    	request.getSession().setAttribute(AppContants.AUTH_SESSION, authList);
        return "redirect:/admin";
    }
    
    /**
     * @Name: loginAjax
     * @Description: 登录Ajax版
     * @Author 任帅鹏（作者）
     * @Version V1.00 （版本号）
     * @Create Date: 2015年12月18日 下午3:41:59（创建日期）
     * @Parameters: @param authUser
     * @Parameters: @return
     * @Return AjaxDto
     * @Throws
     */
    @RequestMapping(value = "/loginAjax", method = RequestMethod.POST)
    @ResponseBody
    public AjaxDto loginAjax(AuthUser authUser) {
        AuthUser authUser_=authUserService.findByLoginName(authUser.getLoginName());
        if(authUser_==null){
            return new AjaxDto(AjaxDto.VALIDATE_CODE,"你的用户不存在");            
        }
        return new AjaxDto();
    }
    
    
    /**
     * 
     * @Name: validLoginPwd
     * @Description: 验证密码是否正确
     * @Author 任帅鹏（作者）
     * @Version V1.00 （版本号）
     * @Create Date: 2015年12月18日 下午8:14:31（创建日期）
     * @Parameters: @param oldPwd
     * @Parameters: @param authUser
     * @Parameters: @return
     * @Return boolean
     * @Throws
     */
    private boolean validLoginPwd(String oldPwd,AuthUser authUser){
    	byte[] salt = Encodes.decodeHex(authUser.getLoginSalt());
        byte[] hashPassword = Digests.sha1(oldPwd.getBytes(), salt, AppContants.HASH_INTERATIONS);       
        String pwd=Encodes.encodeHex(hashPassword);
        if(!authUser.getLoginPwd().equals(pwd)){
        	return false;
        }
    	return true;
    }
    
    
    @RequestMapping("/logout")
    public String logout(HttpSession session){
    	session.invalidate();
    	return "redirect:/login";
    }
}
